"""
使用程序工厂函数，延迟创建程序实例
延迟创建flask应用
应用场景如下：
    1）测试：可以使用多个应用程序的实例。为每一种实例分配不同的配置，从而测试每一种不同的情况
    2）多个实例，要同时运行同一应用的不同版本。可以在你的Web服务器中创建多个实例并分配不同的配置
不使用程序工厂函数创建实例：
app = Flask(__name__)
bootstrap = Bootstrap(app)
mail = Mail(app)
使用程序工厂函数创建实例：
首先实例化函数，再在需要的时候与实例结合从而创建实例，便于后续代码修改维护
bootstrap = Bootstrap()
mail = Mail()
def create_app():
    app = Flask(__name__)
    bootstrap.init_app(app)
    mail.init_app(app)
    return app
"""
from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from flask_login import LoginManager
import pymysql
pymysql.install_as_MySQLdb()

from config import config

bootstrap=Bootstrap()
db=SQLAlchemy()
mail=Mail()
login_manager=LoginManager()
#session_protection属性提供不同的安全等级防止用户会话遭篡改
login_manager.session_protection='strong'
#login_view属性设置登录页面的端点
login_manager.login_view='auth.login'

def create_app(config_name='development'):
    """
    默认创建开发环境的app实例
    """
    app=Flask(__name__)
    app.config.from_object(config[config_name])
    #导入配置信息
    #config[config_name].init_app(app)
    #初始化app
    bootstrap.init_app(app)
    db.init_app(app)
    mail.init_app(app)

    #用户认证新加扩展,将第三方插件和app关联起来
    login_manager.init_app(app)


    #3)注册蓝图，将蓝图实例与app关联起来
    from app.auth import auth
    app.register_blueprint(auth)
    from app.user import user
    app.register_blueprint(user)
    from app.todo import todo
    app.register_blueprint(todo,url_prefix='/todo')

    return app

# if __name__ == '__main__':
#     app=create_app('testing')
#     app.run()
#     app1=create_app()
#     app1.run()